package com.ai.plug.core.register.complete;

import com.ai.plug.core.context.complete.ICompleteContext;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;

//开发者代码
//    ↓
//@McpCompleteScan注解
//    ↓
//McpCompleteScanRegistrar (ImportBeanDefinitionRegistrar)
//    ↓
//McpCompleteScanConfigurer (BeanDefinitionRegistryPostProcessor)
//    ↓
//ClassPathCompleteScanner (ClassPathBeanDefinitionScanner)
//    ↓
//Spring扫描类并创建BeanDefinition
//    ↓
//CompleteBeanNameGenerator.generateBeanName()
//    ├── Spring容器注册: registry.registerBeanName(...)
//    └── MCP框架注册: completeContext.addComplete(beanName)
//    ↓
//Spring容器管理Bean生命周期
//    ↓
//MCP服务通过completeContext获取补全组件

/**
 * 自动扫描装配得类，扩展于 ClassPathBeanDefinitionScanner
 }
 * @time 2025/6/16 17:08
 */

public class ClassPathCompleteScanner extends ClassPathBeanDefinitionScanner {

    /**
     * 完成上下文，用于存储和管理完成的bean名称
     */
    private ICompleteContext completeContext;

    /**
     * 构造方法
     *
     * @param registry        Bean定义注册器
     * @param completeContext 完成上下文
     */
    public ClassPathCompleteScanner(BeanDefinitionRegistry registry, ICompleteContext completeContext) {
        // 调用父类构造方法，false表示不使用默认的过滤器
        super(registry, false);
        // 设置自定义的Bean名称生成器
        setBeanNameGenerator(new ClassPathCompleteScanner.CompleteBeanNameGenerator(completeContext));
    }

    /**
     * 自定义Bean名称生成器
     * 该类继承自AnnotationBeanNameGenerator，用于在生成Bean名称时添加完成上下文处理
     */
    public static class CompleteBeanNameGenerator extends AnnotationBeanNameGenerator {
        /**
         * 完成上下文，用于存储和管理完成的bean名称
         */
        private ICompleteContext completeContext;

        /**
         * 构造方法
         *
         * @param completeContext 完成上下文
         */
        public CompleteBeanNameGenerator(ICompleteContext completeContext) {
            this.completeContext = completeContext;
        }

        /**
         * 重写generateBeanName方法，在生成Bean名称后将其添加到完成上下文中
         *
         * @param definition Bean定义
         * @param registry   Bean定义注册器
         * @return 生成的Bean名称
         */
        @Override
        public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
            // 调用父类方法生成Bean名称
            String beanName = super.generateBeanName(definition, registry);

            // 将生成的Bean名称添加到完成上下文中
            completeContext.addComplete(beanName);

            // 返回生成的Bean名称
            return beanName;
        }
    }
}
